package com.ruoyi.flow.service;

import com.ruoyi.audit.domain.vo.HandleAuditParam;
import com.ruoyi.audit.domain.vo.HistoryTask;
import com.ruoyi.flow.domain.BusBpmnInfo;
import org.activiti.bpmn.model.BpmnModel;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

public interface IProcessService {
    /**
     * 部署流程定义
     * @param bpmnFileName 流程文件名称
     * @param bpmnFileStream 流程文件输入流
     * @return 部署流程结果
     */
    BusBpmnInfo deploy(String bpmnFileName, InputStream bpmnFileStream);

    /**
     * 获取文件输入流
     * @param processDefinitionKey
     * @param version
     * @param type
     * @return
     */
    InputStream getResourceAsStream(String processDefinitionKey, Long version, String type);

    void deleteDefinition(String processDefinitionKey, Long version);

    /**
     * 获取bpmn对象
     * @param definitionKey
     * @param version
     * @return
     */
    BpmnModel getBpmnModel(String definitionKey, Long version);

    /**
     * 开始流程实例
     * @param processDefinitionKey 流程定义key
     * @param businessKey 业务标识
     * @param variables 流程变量
     * @return
     */
    String startProcessInstance(String processDefinitionKey, String businessKey, Map<String, Object> variables);

    /**
     * 删除流程实例
     * @param instanceId
     * @param reason
     */
    void deleteProcessInstance(String instanceId, String reason);

    /**
     * 查询流程实例业务标识列表
     * @param processDefinitionKey 流程定义key
     * @param userId 用户id
     * @return 流程实例业务标识列表
     */
    List<String> selectBusinessKeyList(String processDefinitionKey, Long userId);

    /**
     * 完成任务，查询有没有下一个节点
     * @param instanceId 流程实例id
     * @param userId 用户id ，审核人
     * @param handleAuditParam 接受的参数
     * @return 一个布尔值
     */
    boolean handleTaskByInstanceIdAndAssignee(String instanceId, Long userId, HandleAuditParam handleAuditParam);

    /**
     * 查询业务流程标识
     * @param busBpmnInfo
     * @param userId
     * @return
     */
    List<String> selectHistoryBusinessKeyList(BusBpmnInfo busBpmnInfo, Long userId);

    /**
     * 获取历史审核任务
     * @param instanceId
     * @return
     */
    List<HistoryTask> selectHistoryTaskListByInstanceId(Long instanceId);

    /**
     * 获取图片的文件输入流
     * @param instanceId 流程实例id
     * @return 文件输入流
     */
    InputStream getProcessingImageByInstanceId(String instanceId);
}
